home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / frontend / flyPVS / flyPVS.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-12  |  7.3 KB  |  325 lines

  1. #include "../../lib/Fly3D.h"
  2. #include "pvsengine.h"
  3. #include "opengl.h"
  4. #include "resource.h"
  5. #include "time.h"
  6.  
  7. char *szAppName="flyPVS";
  8. int savelog=0;
  9.  
  10. HDC hdc=0;
  11. HINSTANCE hInstance;
  12. HWND hWndMain;
  13.  
  14. int sample_count=0,
  15.     cur_side=0,
  16.     cur=-1,
  17.     fail_nodes=0,
  18.     curcount=0;
  19. time_t t1,t2;
  20. short **face_nodes;
  21. char file[256];
  22. char bsp_file_name[256]="";
  23.  
  24. float VOLUME_FACTOR=1000000.0f;
  25.  
  26. void DoFrame()
  27. {
  28.     vector v;
  29.     float vol;
  30.     if (curcount==0)
  31.     {
  32.         cur++;
  33.         if (cur>=flyengine->nleaf)
  34.             DestroyWindow(hWndMain);
  35.         else
  36.         if (((pvsEngine *)flyengine)->get_node_random_point(cur,v))
  37.             {
  38.             static_mesh *so=(static_mesh *)flyengine->leaf[cur]->elem;
  39.             v=so->objmesh->bbox.max-so->objmesh->bbox.min;
  40.             vol=v.x*v.y*v.z;
  41.             curcount=(int)(vol/VOLUME_FACTOR)+1;
  42.             }
  43.         else
  44.             fail_nodes++;
  45.     }
  46.     else
  47.     {
  48.         if (((pvsEngine *)flyengine)->get_node_random_point(cur,v))
  49.             {
  50.             ((pvsEngine *)flyengine)->sample_node(flyengine->leaf[cur],v);
  51.             sample_count++;
  52.             }
  53.         curcount--;
  54.     }
  55. }
  56.  
  57. LONG WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  58. {
  59.     LONG lRet = 1;
  60.     static PAINTSTRUCT ps;
  61.     static RECT rect;
  62.  
  63.     switch (uMsg) 
  64.     {
  65.     case WM_KEYDOWN:
  66.         if (wParam==VK_LEFT)
  67.             cur_side=(cur_side==0?5:cur_side-1);
  68.         else 
  69.         if (wParam==VK_RIGHT)
  70.             cur_side=((cur_side+1)%6);
  71.         break;
  72.     case WM_CREATE:
  73.         hdc=GetDC(hWnd);
  74.         if (hdc)
  75.             CreateView(hdc);
  76.         InitView();
  77.         SetWindowPos(hWnd,HWND_TOP,0,0,screen_sx,screen_sy,SWP_SHOWWINDOW);
  78.         break;
  79.  
  80.     case WM_PAINT:
  81.         BeginPaint(hWnd, &ps);
  82.         EndPaint(hWnd, &ps);
  83.         break;
  84.  
  85.     case WM_SIZE:
  86.         GetClientRect(hWnd, &rect);
  87.         ResizeView(rect.right,rect.bottom);
  88.         break;
  89.  
  90.     case WM_ERASEBKGND:
  91.         return 1;
  92.  
  93.     case WM_CLOSE:
  94.         DestroyWindow(hWnd);
  95.         break;
  96.  
  97.     case WM_DESTROY:
  98.         DeleteView();
  99.         if (hdc)
  100.             ReleaseDC(hWnd,hdc);
  101.         
  102.         ((pvsEngine *)flyengine)->save();
  103.  
  104.         if(face_nodes)
  105.             {
  106.             for(int i=0;i<flyengine->nfaces;i++)
  107.                 delete face_nodes[i];
  108.             delete face_nodes;
  109.             }
  110.         PostQuitMessage(0);
  111.         break;
  112.  
  113.     default:
  114.         lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
  115.         break;
  116.     }
  117.  
  118.     return lRet;
  119. }
  120.  
  121. void MyGetProfile(LPTSTR section, LPTSTR key, LPBYTE lpData, DWORD cbData)
  122. {
  123.     HKEY key1,key2,key3,key4;
  124.  
  125.     if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,"Software",0,KEY_READ,&key1))
  126.     {
  127.         if (ERROR_SUCCESS==RegOpenKeyEx(key1,"Paralelo",0,KEY_READ,&key2))
  128.         {
  129.             if (ERROR_SUCCESS==RegOpenKeyEx(key2,"Fly3D",0,KEY_READ,&key3))
  130.             {
  131.                 if (ERROR_SUCCESS==RegOpenKeyEx(key3,section,0,KEY_READ,&key4))
  132.                 {
  133.                     RegQueryValueEx(key4, key, 0, 0, lpData, &cbData);
  134.                     RegCloseKey(key4);
  135.                 }
  136.                 RegCloseKey(key3);
  137.             }
  138.             RegCloseKey(key2);
  139.         }
  140.         RegCloseKey(key1);
  141.     }
  142. }
  143.  
  144. void MyWriteProfile(LPTSTR section, LPCTSTR key, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
  145. {
  146.     HKEY key1,key2,key3,key4;
  147.     DWORD d;
  148.  
  149.     if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,"Software",0,KEY_READ,&key1))
  150.     {
  151.         if (ERROR_SUCCESS==RegCreateKeyEx(key1,"Paralelo",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key2,&d))
  152.         {
  153.             if (ERROR_SUCCESS==RegCreateKeyEx(key2,"Fly3D",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key3,&d))
  154.             {
  155.                 if (ERROR_SUCCESS==RegCreateKeyEx(key3, section,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key4,&d))
  156.                 {
  157.                     RegSetValueEx(key4, key, 0, dwType, lpData, cbData);
  158.                     RegCloseKey(key4);
  159.                 }
  160.                 RegCloseKey(key3);
  161.             }
  162.             RegCloseKey(key2);
  163.         }
  164.         RegCloseKey(key1);
  165.     }
  166. }
  167.  
  168. int OpenBspFileDialog(HWND hWnd,char *file)
  169. {
  170.     OPENFILENAME ofn;
  171.  
  172.     memset(&ofn,0,sizeof(OPENFILENAME));
  173.     char filename[256]="";
  174.     strcpy(filename,file);
  175.  
  176.     ofn.lStructSize=sizeof(OPENFILENAME);
  177.     ofn.hwndOwner=hWnd;
  178.     ofn.hInstance=hInstance;
  179.     ofn.lpstrFilter="bsp fly file (*.bsp)\0*.bsp\0";
  180.     ofn.lpstrDefExt="bsp";
  181.     ofn.lpstrFile=filename;
  182.     ofn.nMaxFile=255;
  183.     ofn.lpstrTitle="Open Fly Scene";
  184.     ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
  185.     
  186.     if (GetOpenFileName(&ofn))
  187.     {
  188.         strcpy(file,filename);
  189.         if (filename[0])
  190.             return 1;
  191.     }
  192.     return 0;
  193. }
  194.  
  195. BOOL FAR PASCAL flypvsProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
  196. {
  197.     switch (uiMsg)
  198.     {
  199.     case WM_INITDIALOG:
  200.         {
  201.         MyGetProfile("viewbsp","filename", (unsigned char *)&bsp_file_name, 256);
  202.         SetWindowText(GetDlgItem(hWnd,IDC_BSPFILE),bsp_file_name);
  203.         if (bsp_file_name[0]==0)
  204.             EnableWindow(GetDlgItem(hWnd,IDOK),0);
  205.         char str[256];
  206.         double d=pow(VOLUME_FACTOR/1000,1.0/3.0);
  207.         sprintf(str,"%.2lf",d);
  208.         SetDlgItemText(hWnd,IDC_SAMPLESVOLUME,str);
  209.         if (screen_sx==128)
  210.             SendDlgItemMessage(hWnd,IDC_SIZE128,BM_SETCHECK,1,0);
  211.         else
  212.         if (screen_sx==256)
  213.             SendDlgItemMessage(hWnd,IDC_SIZE256,BM_SETCHECK,1,0);
  214.         else SendDlgItemMessage(hWnd,IDC_SIZE64,BM_SETCHECK,1,0);
  215.         CheckDlgButton(hWnd,IDC_SAVETXT,savelog);
  216.         }
  217.         break;
  218.  
  219.     case WM_COMMAND:
  220.         switch(LOWORD(wParam))
  221.         {
  222.         case IDC_BROWSE:
  223.             if (OpenBspFileDialog(hWnd,bsp_file_name))
  224.                 if (bsp_file_name[0])
  225.                 {
  226.                     EnableWindow(GetDlgItem(hWnd,IDOK),1);
  227.                     SetDlgItemText(hWnd,IDC_BSPFILE,bsp_file_name);
  228.                 }
  229.                 else EnableWindow(GetDlgItem(hWnd,IDOK),0);
  230.             break;
  231.         case IDOK:
  232.             {
  233.             char str[256];
  234.             float f;
  235.             GetDlgItemText(hWnd,IDC_SAMPLESVOLUME,str,255);
  236.             sscanf(str,"%f",&f);
  237.             VOLUME_FACTOR=f*f*f*1000.0f;
  238.             if (IsDlgButtonChecked(hWnd,IDC_SIZE128))
  239.                 screen_sx=screen_sy=128;
  240.             else 
  241.             if (IsDlgButtonChecked(hWnd,IDC_SIZE256))
  242.                 screen_sx=screen_sy=256;
  243.             else screen_sx=screen_sy=64;
  244.             savelog=IsDlgButtonChecked(hWnd,IDC_SAVETXT);
  245.             MyWriteProfile("viewbsp","filename", REG_SZ, (unsigned char *)&bsp_file_name, sizeof(char)*strlen(bsp_file_name)+1);
  246.             EndDialog (hWnd, IDOK);
  247.             }
  248.             break;
  249.         case IDCANCEL:
  250.             EndDialog (hWnd, IDCANCEL);
  251.             break;
  252.         }
  253.         break;
  254.     }
  255.     return FALSE;
  256.  
  257. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
  258. {
  259.     hInstance=hInst;
  260.     
  261.     if (IDCANCEL==DialogBox(hInst,MAKEINTRESOURCE(IDD_FLYPVS),0,(DLGPROC)flypvsProc))
  262.         return 0;
  263.  
  264.     set_engine(new pvsEngine,0,hInst,FLYAPPID_VIEWBSPGL);
  265.     
  266.     if(((pvsEngine *)flyengine)->opendata(bsp_file_name)==0)
  267.     {
  268.         MessageBox(0, "Could not open scene files!", "ViewBSPgl", MB_OK | MB_ICONEXCLAMATION);
  269.         free_engine();
  270.         return 0;
  271.     }
  272.  
  273.     MSG msg;
  274.     WNDCLASS wndclass;
  275.     memset(&wndclass,0,sizeof(WNDCLASS));
  276.  
  277.     wndclass.lpfnWndProc   = (WNDPROC)MainWndProc;
  278.     wndclass.hInstance     = hInst;
  279.     wndclass.hIcon         = 0;
  280.     wndclass.hCursor       = 0;
  281.     wndclass.hbrBackground = 0;
  282.     wndclass.lpszMenuName  = szAppName;
  283.     wndclass.lpszClassName = szAppName;
  284.  
  285.     if (!RegisterClass(&wndclass))
  286.         return FALSE;
  287.  
  288.     hWndMain = CreateWindow(szAppName, szAppName,
  289.                     WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
  290.                     0, 0, screen_sx, screen_sy,    NULL, NULL, hInst, NULL);
  291.     if (!hWndMain)
  292.         return 0;
  293.  
  294.     time(&t1);
  295.  
  296.     while (1) 
  297.         {
  298.         while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE) 
  299.             {
  300.             if (GetMessage(&msg, NULL, 0, 0)) 
  301.                 {
  302.                 TranslateMessage(&msg);
  303.                 DispatchMessage(&msg);
  304.                 }
  305.             else 
  306.                 {
  307.                 char str[256];
  308.                 time(&t2);
  309.                 int dt=(int)(t2-t1);
  310.                 sprintf(str,
  311.                     "Nodes:\t%i\nInvalid:\t%i\nSamples:\t%i\nTime:\t%02i:%02i:%02i",
  312.                     flyengine->nleaf,fail_nodes,sample_count,dt/3600,(dt/60)%60,dt%60);
  313.                 MessageBox(0,str,"ViewBSPgl",MB_OK|MB_ICONINFORMATION);
  314.                 free_engine();
  315.                 return 1;
  316.                 }
  317.             }
  318.         DoFrame();
  319.         }
  320.  
  321.     return 0;
  322. }
  323.  
  324.